package com.libowu.guide.activity;

import android.app.Activity;
import android.util.Log;
import android.view.View;

import java.lang.reflect.Field;

/**
 * @author libowu
 * @date 2019/08/15
 * 一个通过反射方式自动完成findviewbyid步骤的工具类。
 */
public class FindViewUtils {
    public static FindViewUtils getInstance(){
        return new FindViewUtils();
    }

    /**
     * 绑定view
     * @param activity 要绑定的活动
     * @param clickListener 控件的点击监听器，不需要传入null即可
     */
    public void bindView(Activity activity, View.OnClickListener clickListener){
        //获取所有属性
        Field[] field = activity.getClass().getDeclaredFields();
        //遍历属性，对传入的实例进行view的设置
        for (Field f:field){
            try {
                //设置为允许访问
                f.setAccessible(true);
                //判断实例是不是view的子类，不是直接跳过，不处理
                if (!View.class.isAssignableFrom(f.getType())){
                    continue;
                }
                //获取属性名称,用于找出view的id
                String name = f.toString().substring(f.toString().lastIndexOf(".")+1);
                //通过属性名称获取view的id
                int id = activity.getResources().getIdentifier(name,"id",activity.getPackageName());
                //实例化view
                View view = activity.findViewById(id);
                //设置view的点击事件
                if (clickListener != null){
                    view.setOnClickListener(clickListener);
                }
                //设置view
                f.set(activity,view);
                //Log.e("日志","输出内容为:"+"属性名称."+name+" --> "+f.get(activity)+",view的id为："+id+",类型为："+f.getGenericType()+"view为：");
            } catch (IllegalAccessException e) {
                Log.e("FindViewUtilsError","reason:"+e.getLocalizedMessage());
                e.printStackTrace();
            }
        }
    }
}
